package com.yiren.dbaa.util;

import android.content.Context;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.yiren.backstage.config.api.LoadConfigApi;
import com.yiren.backstage.config.enums.LocationTypeEnum;
import com.yiren.backstage.currency.bean.GpsInfoBean;
import com.yiren.backstage.currency.enums.GpsStateEnum;

import static com.yiren.backstage.currency.bean.GpsInfoBean.lastGpsInfo;

/**
 * @author lwb
 * @date :2021/12/10 11:09
 * @description: 百度定位
 */
public class BDLocationUtil {

    private Context mContext;
    private LocationClient locationClient;  // 百度定位

    public GpsInfoBean gpsInfo = GpsInfoBean.getInstance();

    public BDLocationUtil(Context context) {
        this.mContext = context;
    }

    /**
     * 定位SDK监听函数
     * 61:定位结果描述：GPS定位结果 ，GPS定位结果需要手机打开GPS开关或者设置手机为高精度定位模式，GPS定位结果需要一定的搜星时间才能获得， 连接网络的情况下会加速GPS定位速度
     * 66:定位结果描述：离线定位成功结果 ，一般由于手机网络不通，会请求定位SDK内部的离线定位策略，这种定位也属于有效的定位结果
     * 161:定位结果描述：网络定位结果 ，表示网络定位成功，属于有效的定位结果
     */
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            int resCode = location.getLocType();
            if (resCode == BDLocation.TypeGpsLocation || resCode == BDLocation.TypeNetWorkLocation || resCode == BDLocation.TypeOffLineLocation) {
                setGpsInfo(location);
                gpsInfo.setInternalLocationState(GpsStateEnum.LOCATION_SUCCESS);
                if (LoadConfigApi.loadSignalSourceConfig(mContext).getLocationType().equals(LocationTypeEnum.BUILT_IN)) {
                    locationClient.stop(); // 定位成功立即停止百度定位
                }
            } else {
                gpsInfo.setInternalLocationState(GpsStateEnum.LOCATIONING);
                Log.d("GpsUtil", "定位失败，错误码：" + resCode);
            }
        }

        public void onReceivePoi(com.baidu.location.BDLocation poiLocation) {
            if (poiLocation == null) {
                return;
            }
        }
    }

    /**
     * 内置GPS模式
     * BD09：为百度坐标系，其中bd09ll表示百度经纬度坐标，bd09mc表示百度墨卡托米制坐标；
     */
    public void startGpsListenForInMode() {
        if (null != locationClient) {
            locationClient.stop();
        }
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);// 打开gps
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");// 可选，默认gcj02，设置返回的定位结果坐标系，如果配合百度地图使用，建议设置为bd09ll;
        option.setScanSpan(LocationClientOption.MIN_SCAN_SPAN);// 设置发起定位请求的间隔时间为1000ms
        // option.setScanSpan(3000);// 可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);// 可选，设置是否需要地址信息，默认不需要
        option.setIsNeedLocationDescribe(true);// 可选，设置是否需要地址描述
        option.setNeedDeviceDirect(true);// 可选，设置是否需要设备方向结果
        option.setLocationNotify(true);// 可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIgnoreKillProcess(true);// 可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.setIsNeedLocationDescribe(true);// 可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);// 可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.SetIgnoreCacheException(true);// 可选，默认false，设置是否收集CRASH信息，默认收集
        option.setIsNeedAltitude(true);// 可选，默认false，设置定位时是否需要海拔信息，默认不需要，除基础定位版本都可用
        option.disableCache(true); // 禁止启用缓存定位
        // option.setTimeOut(6000);
        //使用getApplicationContext()防止内存溢出
        try {
            locationClient = new LocationClient(mContext.getApplicationContext());
            locationClient.registerLocationListener(new MyLocationListener());
            locationClient.setLocOption(option);
            locationClient.requestLocation();
            locationClient.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param location
     */
    public GpsInfoBean setGpsInfo(BDLocation location) {
        //GPS漂移处理，对比上次GPS车速，如果相差30码 就取上次GPS对象
        if (null != lastGpsInfo && Math.abs(location.getSpeed() - lastGpsInfo.getSpeed()) > 40) {
            return lastGpsInfo;
        }
        gpsInfo.setLocation(location.getLongitude(), location.getLatitude());
        // 速度
        gpsInfo.setSpeed(location.getSpeed());
        // 方向
        gpsInfo.setBearing(location.getDirection());
        // 高度
        gpsInfo.setAltitude(location.getAltitude());
        // 省
        gpsInfo.setProvince(location.getProvince());
        // 市
        gpsInfo.setCity(location.getCity());
        // 县
        gpsInfo.setArea(location.getDistrict());
        // 街道
        gpsInfo.setStreet(location.getStreet());
        // 地址
        gpsInfo.setAddress(location.getAddress() + "");
        // 方向
        gpsInfo.setDirection(location.getDirection());
        // 县
        gpsInfo.setRadius(location.getRadius());
        lastGpsInfo = gpsInfo;
        return gpsInfo;
    }
}
